From 168c389917eae8b7df0662d1974d6ff7df1d6030 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 17 Mar 2008 10:45:24 +0000 Subject: [PATCH] Move iommu code to arch-generic locations, and also clean up some VT-d code. Signed-off-by: Weidong Han --- xen/arch/x86/domain.c | 2 +- xen/arch/x86/domctl.c | 2 +- xen/arch/x86/hvm/Makefile | 1 - xen/arch/x86/hvm/intercept.c | 2 +- xen/arch/x86/irq.c | 2 +- xen/arch/x86/mm/p2m.c | 2 +- xen/drivers/passthrough/Makefile | 3 + xen/drivers/passthrough/amd/iommu_detect.c | 2 +- xen/drivers/passthrough/amd/iommu_map.c | 2 +- xen/drivers/passthrough/{vtd => }/io.c | 26 +--- .../x86/hvm => drivers/passthrough}/iommu.c | 11 +- xen/drivers/passthrough/vtd/Makefile | 1 - xen/drivers/passthrough/vtd/dmar.h | 2 +- xen/drivers/passthrough/vtd/extern.h | 2 - xen/drivers/passthrough/vtd/intremap.c | 26 +--- xen/drivers/passthrough/vtd/iommu.c | 132 ++++++++++++++---- .../passthrough/vtd/iommu.h} | 12 +- xen/drivers/passthrough/vtd/qinval.c | 10 +- xen/drivers/passthrough/vtd/utils.c | 11 +- xen/drivers/passthrough/vtd/vtd.h | 11 +- xen/include/asm-x86/fixmap.h | 2 +- xen/include/asm-x86/hvm/domain.h | 4 +- xen/include/asm-x86/io_apic.h | 2 +- xen/include/{asm-x86 => xen}/hvm/iommu.h | 2 +- xen/include/{asm-x86 => xen}/iommu.h | 24 ++-- 25 files changed, 146 insertions(+), 150 deletions(-) rename xen/drivers/passthrough/{vtd => }/io.c (93%) rename xen/{arch/x86/hvm => drivers/passthrough}/iommu.c (93%) rename xen/{include/asm-x86/hvm/vmx/intel-iommu.h => drivers/passthrough/vtd/iommu.h} (97%) rename xen/include/{asm-x86 => xen}/hvm/iommu.h (98%) rename xen/include/{asm-x86 => xen}/iommu.h (83%) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index d177e814f9..c56db37b37 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include #ifdef CONFIG_COMPAT #include #endif diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index 4e8ad4acde..cdb2bd031f 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include long arch_do_domctl( struct xen_domctl *domctl, diff --git a/xen/arch/x86/hvm/Makefile b/xen/arch/x86/hvm/Makefile index a480d584ea..48506dd886 100644 --- a/xen/arch/x86/hvm/Makefile +++ b/xen/arch/x86/hvm/Makefile @@ -6,7 +6,6 @@ obj-y += hvm.o obj-y += i8254.o obj-y += intercept.o obj-y += io.o -obj-y += iommu.o obj-y += irq.o obj-y += mtrr.o obj-y += pmtimer.o diff --git a/xen/arch/x86/hvm/intercept.c b/xen/arch/x86/hvm/intercept.c index e02a13001e..04c5da7b6f 100644 --- a/xen/arch/x86/hvm/intercept.c +++ b/xen/arch/x86/hvm/intercept.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include extern struct hvm_mmio_handler hpet_mmio_handler; extern struct hvm_mmio_handler vlapic_mmio_handler; diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index b5087f6633..fc050d7d60 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */ int opt_noirqbalance = 0; diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 3ead6ddb90..e37b9508e3 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include /* Debugging and auditing of the P2M code? */ #define P2M_AUDIT 0 diff --git a/xen/drivers/passthrough/Makefile b/xen/drivers/passthrough/Makefile index 58e0745b94..68badb11d4 100644 --- a/xen/drivers/passthrough/Makefile +++ b/xen/drivers/passthrough/Makefile @@ -1,2 +1,5 @@ subdir-$(x86) += vtd subdir-$(x86) += amd + +obj-y += iommu.o +obj-y += io.o diff --git a/xen/drivers/passthrough/amd/iommu_detect.c b/xen/drivers/passthrough/amd/iommu_detect.c index 65bbc065b8..2396268d32 100644 --- a/xen/drivers/passthrough/amd/iommu_detect.c +++ b/xen/drivers/passthrough/amd/iommu_detect.c @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include #include "../pci-direct.h" diff --git a/xen/drivers/passthrough/amd/iommu_map.c b/xen/drivers/passthrough/amd/iommu_map.c index 32aa216798..ea0d713dc0 100644 --- a/xen/drivers/passthrough/amd/iommu_map.c +++ b/xen/drivers/passthrough/amd/iommu_map.c @@ -19,7 +19,7 @@ */ #include -#include +#include #include #include diff --git a/xen/drivers/passthrough/vtd/io.c b/xen/drivers/passthrough/io.c similarity index 93% rename from xen/drivers/passthrough/vtd/io.c rename to xen/drivers/passthrough/io.c index 714de89735..a364627d4e 100644 --- a/xen/drivers/passthrough/vtd/io.c +++ b/xen/drivers/passthrough/io.c @@ -18,32 +18,8 @@ * Copyright (C) Xiaohui Xin */ -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include static void pt_irq_time_out(void *data) { diff --git a/xen/arch/x86/hvm/iommu.c b/xen/drivers/passthrough/iommu.c similarity index 93% rename from xen/arch/x86/hvm/iommu.c rename to xen/drivers/passthrough/iommu.c index 963ef5a029..c98d86f4dd 100644 --- a/xen/arch/x86/hvm/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -13,17 +13,8 @@ * Place - Suite 330, Boston, MA 02111-1307 USA. */ -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include +#include extern struct iommu_ops intel_iommu_ops; extern struct iommu_ops amd_iommu_ops; diff --git a/xen/drivers/passthrough/vtd/Makefile b/xen/drivers/passthrough/vtd/Makefile index b8e880bc22..53b18b8f3f 100644 --- a/xen/drivers/passthrough/vtd/Makefile +++ b/xen/drivers/passthrough/vtd/Makefile @@ -1,6 +1,5 @@ obj-y += iommu.o obj-y += dmar.o obj-y += utils.o -obj-y += io.o obj-y += qinval.o obj-y += intremap.o diff --git a/xen/drivers/passthrough/vtd/dmar.h b/xen/drivers/passthrough/vtd/dmar.h index 58b535d926..46cbb19e3f 100644 --- a/xen/drivers/passthrough/vtd/dmar.h +++ b/xen/drivers/passthrough/vtd/dmar.h @@ -22,7 +22,7 @@ #define _DMAR_H_ #include -#include +#include extern u8 dmar_host_address_width; diff --git a/xen/drivers/passthrough/vtd/extern.h b/xen/drivers/passthrough/vtd/extern.h index 9e2ac576ea..7d449ab2e9 100644 --- a/xen/drivers/passthrough/vtd/extern.h +++ b/xen/drivers/passthrough/vtd/extern.h @@ -42,8 +42,6 @@ int queue_invalidate_iec(struct iommu *iommu, int invalidate_sync(struct iommu *iommu); int iommu_flush_iec_global(struct iommu *iommu); int iommu_flush_iec_index(struct iommu *iommu, u8 im, u16 iidx); -void print_iommu_regs(struct acpi_drhd_unit *drhd); -int vtd_hw_check(void); struct iommu * ioapic_to_iommu(unsigned int apic_id); struct acpi_drhd_unit * ioapic_to_drhd(unsigned int apic_id); void clear_fault_bits(struct iommu *iommu); diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c index ede57f4d94..301a8f623b 100644 --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -18,28 +18,10 @@ * Copyright (C) Xiaohui Xin */ -#include -#include -#include #include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include +#include +#include "iommu.h" #include "dmar.h" #include "vtd.h" #include "../pci-direct.h" @@ -172,7 +154,7 @@ io_apic_read_remap_rte( struct iommu *iommu = ioapic_to_iommu(mp_ioapics[apic].mpc_apicid); struct ir_ctrl *ir_ctrl = iommu_ir_ctrl(iommu); - if ( !iommu || !(ir_ctrl->iremap) ) + if ( !iommu || !ir_ctrl || !(ir_ctrl->iremap) ) { *IO_APIC_BASE(apic) = reg; return *(IO_APIC_BASE(apic)+4); @@ -218,7 +200,7 @@ io_apic_write_remap_rte( struct iommu *iommu = ioapic_to_iommu(mp_ioapics[apic].mpc_apicid); struct ir_ctrl *ir_ctrl = iommu_ir_ctrl(iommu); - if ( !iommu || !(ir_ctrl->iremap) ) + if ( !iommu || !ir_ctrl || !(ir_ctrl->iremap) ) { *IO_APIC_BASE(apic) = reg; *(IO_APIC_BASE(apic)+4) = value; diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index c569101f9e..f1650407d5 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -19,17 +19,12 @@ * Copyright (C) Allen Kay - adapted to xen */ -#include #include -#include #include #include #include -#include -#include -#include -#include -#include +#include +#include "iommu.h" #include "dmar.h" #include "../pci-direct.h" #include "../pci_regs.h" @@ -74,6 +69,93 @@ static void iommu_domid_release(struct domain *d) } } +static struct intel_iommu *alloc_intel_iommu(void) +{ + struct intel_iommu *intel; + + intel = xmalloc(struct intel_iommu); + if ( !intel ) + { + gdprintk(XENLOG_ERR VTDPREFIX, + "Allocate intel_iommu failed.\n"); + return NULL; + } + memset(intel, 0, sizeof(struct intel_iommu)); + + spin_lock_init(&intel->qi_ctrl.qinval_lock); + spin_lock_init(&intel->qi_ctrl.qinval_poll_lock); + + spin_lock_init(&intel->ir_ctrl.iremap_lock); + + return intel; +} + +static void free_intel_iommu(struct intel_iommu *intel) +{ + if ( intel ) + { + xfree(intel); + intel = NULL; + } +} + +struct qi_ctrl *iommu_qi_ctrl(struct iommu *iommu) +{ + if ( !iommu ) + return NULL; + + if ( !iommu->intel ) + { + iommu->intel = alloc_intel_iommu(); + if ( !iommu->intel ) + { + dprintk(XENLOG_ERR VTDPREFIX, + "iommu_qi_ctrl: Allocate iommu->intel failed.\n"); + return NULL; + } + } + + return &(iommu->intel->qi_ctrl); +} + +struct ir_ctrl *iommu_ir_ctrl(struct iommu *iommu) +{ + if ( !iommu ) + return NULL; + + if ( !iommu->intel ) + { + iommu->intel = alloc_intel_iommu(); + if ( !iommu->intel ) + { + dprintk(XENLOG_ERR VTDPREFIX, + "iommu_ir_ctrl: Allocate iommu->intel failed.\n"); + return NULL; + } + } + + return &(iommu->intel->ir_ctrl); +} + +struct iommu_flush *iommu_get_flush(struct iommu *iommu) +{ + if ( !iommu ) + return NULL; + + if ( !iommu->intel ) + { + iommu->intel = alloc_intel_iommu(); + if ( !iommu->intel ) + { + dprintk(XENLOG_ERR VTDPREFIX, + "iommu_get_flush: Allocate iommu->intel failed.\n"); + return NULL; + } + } + + return &(iommu->intel->flush); +} + unsigned int x86_clflush_size; void clflush_cache_range(void *adr, int size) { @@ -756,40 +838,34 @@ static int iommu_page_fault_do_one(struct iommu *iommu, int type, PCI_SLOT(source_id & 0xFF), PCI_FUNC(source_id & 0xFF), addr, fault_reason, iommu->reg); - if (fault_reason < 0x20) + if ( fault_reason < 0x20 ) print_vtd_entries(current->domain, iommu, (source_id >> 8), - (source_id & 0xff), (addr >> PAGE_SHIFT)); + (source_id & 0xff), (addr >> PAGE_SHIFT)); return 0; } static void iommu_fault_status(u32 fault_status) { - if (fault_status & DMA_FSTS_PFO) + if ( fault_status & DMA_FSTS_PFO ) dprintk(XENLOG_ERR VTDPREFIX, "iommu_fault_status: Fault Overflow\n"); - else - if (fault_status & DMA_FSTS_PPF) + else if ( fault_status & DMA_FSTS_PPF ) dprintk(XENLOG_ERR VTDPREFIX, "iommu_fault_status: Primary Pending Fault\n"); - else - if (fault_status & DMA_FSTS_AFO) + else if ( fault_status & DMA_FSTS_AFO ) dprintk(XENLOG_ERR VTDPREFIX, "iommu_fault_status: Advanced Fault Overflow\n"); - else - if (fault_status & DMA_FSTS_APF) + else if ( fault_status & DMA_FSTS_APF ) dprintk(XENLOG_ERR VTDPREFIX, "iommu_fault_status: Advanced Pending Fault\n"); - else - if (fault_status & DMA_FSTS_IQE) + else if ( fault_status & DMA_FSTS_IQE ) dprintk(XENLOG_ERR VTDPREFIX, "iommu_fault_status: Invalidation Queue Error\n"); - else - if (fault_status & DMA_FSTS_ICE) + else if ( fault_status & DMA_FSTS_ICE ) dprintk(XENLOG_ERR VTDPREFIX, "iommu_fault_status: Invalidation Completion Error\n"); - else - if (fault_status & DMA_FSTS_ITE) + else if ( fault_status & DMA_FSTS_ITE ) dprintk(XENLOG_ERR VTDPREFIX, "iommu_fault_status: Invalidation Time-out Error\n"); } @@ -976,8 +1052,6 @@ struct iommu *iommu_alloc(void *hw_data) { struct acpi_drhd_unit *drhd = (struct acpi_drhd_unit *) hw_data; struct iommu *iommu; - struct qi_ctrl *qi_ctrl; - struct ir_ctrl *ir_ctrl; if ( nr_iommus > MAX_IOMMUS ) { @@ -1014,12 +1088,7 @@ struct iommu *iommu_alloc(void *hw_data) spin_lock_init(&iommu->lock); spin_lock_init(&iommu->register_lock); - qi_ctrl = iommu_qi_ctrl(iommu); - spin_lock_init(&qi_ctrl->qinval_lock); - spin_lock_init(&qi_ctrl->qinval_poll_lock); - - ir_ctrl = iommu_ir_ctrl(iommu); - spin_lock_init(&ir_ctrl->iremap_lock); + iommu->intel = alloc_intel_iommu(); drhd->iommu = iommu; return iommu; @@ -1036,6 +1105,7 @@ static void free_iommu(struct iommu *iommu) free_xenheap_page((void *)iommu->root_entry); if ( iommu->reg ) iounmap(iommu->reg); + free_intel_iommu(iommu->intel); free_irq(iommu->vector); xfree(iommu); } @@ -1063,7 +1133,7 @@ int intel_iommu_domain_init(struct domain *domain) iommu = drhd->iommu ? : iommu_alloc(drhd); /* calculate AGAW */ - if (guest_width > cap_mgaw(iommu->cap)) + if ( guest_width > cap_mgaw(iommu->cap) ) guest_width = cap_mgaw(iommu->cap); adjust_width = guestwidth_to_adjustwidth(guest_width); agaw = width_to_agaw(adjust_width); diff --git a/xen/include/asm-x86/hvm/vmx/intel-iommu.h b/xen/drivers/passthrough/vtd/iommu.h similarity index 97% rename from xen/include/asm-x86/hvm/vmx/intel-iommu.h rename to xen/drivers/passthrough/vtd/iommu.h index 07b07c09d3..82593b455a 100644 --- a/xen/include/asm-x86/hvm/vmx/intel-iommu.h +++ b/xen/drivers/passthrough/vtd/iommu.h @@ -105,11 +105,6 @@ #define ecap_cache_hints(e) ((e >> 5) & 0x1) #define ecap_pass_thru(e) ((e >> 6) & 0x1) -#define PAGE_SHIFT_4K (12) -#define PAGE_SIZE_4K (1UL << PAGE_SHIFT_4K) -#define PAGE_MASK_4K (((u64)-1) << PAGE_SHIFT_4K) -#define PAGE_ALIGN_4K(addr) (((addr) + PAGE_SIZE_4K - 1) & PAGE_MASK_4K) - /* IOTLB_REG */ #define DMA_TLB_FLUSH_GRANU_OFFSET 60 #define DMA_TLB_GLOBAL_FLUSH (((u64)1) << 60) @@ -423,7 +418,6 @@ struct poll_info { #define VTD_PAGE_TABLE_LEVEL_4 4 #define DEFAULT_DOMAIN_ADDRESS_WIDTH 48 -#define MAX_IOMMUS 32 #define MAX_IOMMU_REGS 0xc0 extern struct list_head acpi_drhd_units; @@ -439,8 +433,8 @@ struct qi_ctrl { }; struct ir_ctrl { - struct iremap_entry *iremap; /* interrupt remap table */ - int iremap_index; /* interrupt remap index */ + struct iremap_entry *iremap; /* interrupt remap table */ + int iremap_index; /* interrupt remap index */ spinlock_t iremap_lock; /* lock for irq remappping table */ }; @@ -454,7 +448,7 @@ struct iommu_flush { struct intel_iommu { struct qi_ctrl qi_ctrl; struct ir_ctrl ir_ctrl; - struct iommu_flush flush; + struct iommu_flush flush; }; #endif diff --git a/xen/drivers/passthrough/vtd/qinval.c b/xen/drivers/passthrough/vtd/qinval.c index 75d987b36a..e7aa6cea83 100644 --- a/xen/drivers/passthrough/vtd/qinval.c +++ b/xen/drivers/passthrough/vtd/qinval.c @@ -19,15 +19,9 @@ */ -#include -#include -#include #include -#include -#include -#include -#include -#include +#include +#include "iommu.h" #include "dmar.h" #include "vtd.h" #include "../pci-direct.h" diff --git a/xen/drivers/passthrough/vtd/utils.c b/xen/drivers/passthrough/vtd/utils.c index 40ab649e37..b0c9d9eec5 100644 --- a/xen/drivers/passthrough/vtd/utils.c +++ b/xen/drivers/passthrough/vtd/utils.c @@ -17,22 +17,15 @@ * Copyright (C) Allen Kay */ -#include -#include -#include -#include #include #include -#include +#include +#include "iommu.h" #include "dmar.h" #include "../pci-direct.h" #include "../pci_regs.h" #include "msi.h" -#include -#include -#include - #define INTEL 0x8086 #define SEABURG 0x4000 #define C_STEP 2 diff --git a/xen/drivers/passthrough/vtd/vtd.h b/xen/drivers/passthrough/vtd/vtd.h index 1c0372f154..38805c38ea 100644 --- a/xen/drivers/passthrough/vtd/vtd.h +++ b/xen/drivers/passthrough/vtd/vtd.h @@ -21,16 +21,7 @@ #ifndef _VTD_H_ #define _VTD_H_ -#include -#include - -#define VTDPREFIX "[VT-D]" - -#define DMAR_OPERATION_TIMEOUT (HZ*60) /* 1m */ -#define time_after(a,b) \ - (typecheck(unsigned long, a) && \ - typecheck(unsigned long, b) && \ - ((long)(b) - (long)(a) < 0)) +#include struct IO_APIC_route_remap_entry { union { diff --git a/xen/include/asm-x86/fixmap.h b/xen/include/asm-x86/fixmap.h index 644c9ff53c..4495c39818 100644 --- a/xen/include/asm-x86/fixmap.h +++ b/xen/include/asm-x86/fixmap.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include /* diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h index 0e6ee2ace4..1361806574 100644 --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -21,13 +21,13 @@ #ifndef __ASM_X86_HVM_DOMAIN_H__ #define __ASM_X86_HVM_DOMAIN_H__ -#include +#include #include #include #include #include #include -#include +#include #include #include diff --git a/xen/include/asm-x86/io_apic.h b/xen/include/asm-x86/io_apic.h index 86c91b6762..00fafcf55d 100644 --- a/xen/include/asm-x86/io_apic.h +++ b/xen/include/asm-x86/io_apic.h @@ -6,7 +6,7 @@ #include #include #include -#include +#include /* * Intel IO-APIC support for SMP and UP systems. diff --git a/xen/include/asm-x86/hvm/iommu.h b/xen/include/xen/hvm/iommu.h similarity index 98% rename from xen/include/asm-x86/hvm/iommu.h rename to xen/include/xen/hvm/iommu.h index 5ac7aef1c9..8b11d44c16 100644 --- a/xen/include/asm-x86/hvm/iommu.h +++ b/xen/include/xen/hvm/iommu.h @@ -20,7 +20,7 @@ #ifndef __ASM_X86_HVM_IOMMU_H__ #define __ASM_X86_HVM_IOMMU_H__ -#include +#include #include #include #include diff --git a/xen/include/asm-x86/iommu.h b/xen/include/xen/iommu.h similarity index 83% rename from xen/include/asm-x86/iommu.h rename to xen/include/xen/iommu.h index 1f975dfa53..362bffd155 100644 --- a/xen/include/asm-x86/iommu.h +++ b/xen/include/xen/iommu.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #include @@ -33,9 +32,13 @@ extern int amd_iommu_enabled; #define iommu_enabled ( amd_iommu_enabled || vtd_enabled ) #define domain_hvm_iommu(d) (&d->arch.hvm_domain.hvm_iommu) #define domain_vmx_iommu(d) (&d->arch.hvm_domain.hvm_iommu.vmx_iommu) -#define iommu_qi_ctrl(iommu) (&(iommu->intel.qi_ctrl)); -#define iommu_ir_ctrl(iommu) (&(iommu->intel.ir_ctrl)); -#define iommu_get_flush(iommu) (&(iommu->intel.flush)); + +#define MAX_IOMMUS 32 + +#define PAGE_SHIFT_4K (12) +#define PAGE_SIZE_4K (1UL << PAGE_SHIFT_4K) +#define PAGE_MASK_4K (((u64)-1) << PAGE_SHIFT_4K) +#define PAGE_ALIGN_4K(addr) (((addr) + PAGE_SIZE_4K - 1) & PAGE_MASK_4K) /* * The PCI interface treats multi-function devices as independent @@ -66,7 +69,7 @@ struct iommu { spinlock_t register_lock; /* protect iommu register handling */ struct root_entry *root_entry; /* virtual address */ unsigned int vector; - struct intel_iommu intel; + struct intel_iommu *intel; }; int iommu_setup(void); @@ -89,10 +92,12 @@ int pt_irq_create_bind_vtd(struct domain *d, xen_domctl_bind_pt_irq_t *pt_irq_bind); int pt_irq_destroy_bind_vtd(struct domain *d, xen_domctl_bind_pt_irq_t *pt_irq_bind); -unsigned int io_apic_read_remap_rte( - unsigned int apic, unsigned int reg); +unsigned int io_apic_read_remap_rte(unsigned int apic, unsigned int reg); void io_apic_write_remap_rte(unsigned int apic, - unsigned int reg, unsigned int value); + unsigned int reg, unsigned int value); +struct qi_ctrl *iommu_qi_ctrl(struct iommu *iommu); +struct ir_ctrl *iommu_ir_ctrl(struct iommu *iommu); +struct iommu_flush *iommu_get_flush(struct iommu *iommu); #define PT_IRQ_TIME_OUT MILLISECS(8) #define VTDPREFIX "[VT-D]" @@ -103,7 +108,8 @@ struct iommu_ops { void (*teardown)(struct domain *d); int (*map_page)(struct domain *d, unsigned long gfn, unsigned long mfn); int (*unmap_page)(struct domain *d, unsigned long gfn); - void (*reassign_device)(struct domain *s, struct domain *t, u8 bus, u8 devfn); + void (*reassign_device)(struct domain *s, struct domain *t, + u8 bus, u8 devfn); }; #endif /* _IOMMU_H_ */ -- 2.30.2